/*
 * cantttimebaritem.cpp
 * 甘特图时间条项实现文件
 * 实现CanttTimeBarItem类的成员函数，负责绘制时间条和事件标记
 */
#include "cantttimebaritem.h"
#include "definition.h"

#include <QBrush>
#include <QPen>
#include <QCursor>
#include <QPoint>
#include <QLabel>
#include <QGraphicsProxyWidget>

// 事件项Y轴偏移量
const int eventItemYOffset = 2;

/**
 * @brief CanttTimeBarItem类的构造函数
 * @param start 开始时间
 * @param end 结束时间
 * @param type 时间条类型
 * @param factor 时间与像素的转换因子
 * @details 初始化时间条的位置、大小、颜色和样式
 */
CanttTimeBarItem::CanttTimeBarItem(const QDateTime &start, const QDateTime &end, TimeType type, double factor)
    : QGraphicsRectItem(nullptr),
      m_pFactor(factor),
      m_startDateTime(start),
      m_endDateTime(end)
{
    // 计算时间条宽度
    double width = (end.toMSecsSinceEpoch() - start.toMSecsSinceEpoch()) / m_pFactor;

    // 设置时间条矩形区域
    setRect(0, 0, width, canttTimeBarHeight);
    // 设置鼠标指针为手形
    setCursor(QCursor(Qt::PointingHandCursor));

    // 根据时间条类型设置不同的颜色
    if (CanttTimeBarItem::PlanTime == type)
    {
        setBrush(QBrush(QColor(92, 201, 221)));  // 计划时间条颜色
    }
    else
    {
        setBrush(QBrush(QColor(233, 252, 74)));  // 实际时间条颜色
    }

    // 设置边框样式为无边框
    QPen pen;
    pen.setStyle(Qt::NoPen);
    setPen(pen);
}

/**
 * @brief 添加事件到时间条
 * @param dateTime 事件发生时间
 * @param type 事件类型
 * @details 检查事件时间是否在时间条范围内，如果是则创建并添加事件项
 */
void CanttTimeBarItem::addEvent(const QDateTime &dateTime, CanttTimeBarItem::EventType type)
{
    // 检查事件时间是否在时间条范围内
    if (dateTime < m_startDateTime || dateTime > m_endDateTime)
    {
        return;
    }

    // 创建事件项
    QGraphicsItem *item = createEventItem(type);
    QGraphicsItem *item2 = createEventItem2();

    // 计算事件项的X坐标
    double x = (dateTime.toMSecsSinceEpoch() - m_startDateTime.toMSecsSinceEpoch()) / m_pFactor;

    // 设置事件项的位置
    item->setPos(x, eventItemYOffset);
    item2->setPos(x*4, this->boundingRect().center().y());
}

/**
 * @brief 创建事件项
 * @param type 事件类型
 * @return 返回创建的事件图形项
 * @details 根据事件类型创建带有不同文本和样式的事件标签
 */
QGraphicsItem *CanttTimeBarItem::createEventItem(CanttTimeBarItem::EventType type)
{
    // 创建标签控件
    QLabel *label = new QLabel;
    // 设置标签样式
    label->setStyleSheet("QLabel {"
                         "background-color: transparent;"
                         "min-height: 12px;"
                         "max-height: 12px;"
                         "font-size: 11px;"
                         "padding-left: -2px;"
                         "border-width: 0 0 0 12;"
                         "border-image: url(:/img/event/takeoff.png) 0 0 0 64;}");
    // 设置标签提示信息
    label->setToolTip(QStringLiteral("开始起飞\n人员：张三\n地点：xxx根据地"));

    // 根据事件类型设置标签文本
    switch (type)
    {
    case CanttTimeBarItem::TakeoffEvent:
        label->setText(QStringLiteral("起飞"));
        break;
    case CanttTimeBarItem::RotationEvent:
        label->setText(QStringLiteral("转角"));
        break;
    case CanttTimeBarItem::SwitchChannelEvent:
        label->setText(QStringLiteral("切换频道"));
        break;
    case CanttTimeBarItem::LandEvent:
        label->setText(QStringLiteral("降落"));
        break;
    default:
        break;
    }

    // 创建图形代理部件并添加标签
    QGraphicsProxyWidget *proxy = new QGraphicsProxyWidget(this);
    proxy->setWidget(label);

    return proxy;
}

#include "DotLabelItem.h"
/**
 * @brief 创建事件项2
 * @return 返回创建的事件图形项
 * @details 创建一个DotLabelItem类型的事件项
 */
QGraphicsItem *CanttTimeBarItem::createEventItem2()
{
    auto *item = new DotLabelItem(QStringLiteral("切换频道"),this);
    return item;
}
